home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok24.lha / DME / SRC / source.zoo / gadgets.c < prev    next >
C/C++ Source or Header  |  1989-07-03  |  7KB  |  256 lines

  1. /*
  2. ** gadgets.c 1989 by Thomas Siemens and Volker Rudolph
  3. */
  4.  
  5. /*** included files ***/
  6.  
  7. #include "defs.h"
  8.  
  9. /*** data section ***/
  10.  
  11. SHORT BorderVectors1[] = {
  12.         0,0,
  13.         5,0,
  14.         5,5,
  15.         3,5,
  16.         6,8,
  17.         7,8,
  18.         10,5,
  19.         8,5,
  20.         8,0,
  21.         14,0,
  22.         14,10,
  23.         0,10,
  24.         0,0
  25. };
  26. struct Border Border1 = {
  27.         0,-1,  /* XY origin relative to container TopLeft */
  28.         1,0,JAM1,       /* front pen, back pen and drawmode */
  29.         13,      /* number of XY vectors */
  30.         BorderVectors1, /* pointer to XY vectors */
  31.         NULL    /* next border in list */
  32. };
  33.  
  34. /* arrow down */
  35. struct Gadget Gadget3 = {
  36.         NULL,   /* next gadget */
  37.         -15,-18,        /* origin XY of hit box relative to window TopLeft */
  38.         16,9,   /* hit box width and height */
  39.         GRELBOTTOM+GRELRIGHT,            /* gadget flags */
  40.         RELVERIFY+GADGIMMEDIATE+RIGHTBORDER,       /* activation flags */
  41.         BOOLGADGET,     /* gadget type flags */
  42.         (APTR)&Border1, /* gadget border or image to be rendered */
  43.         NULL,   /* alternate imagery for selection */
  44.         NULL,   /* first IntuiText structure */
  45.         NULL,   /* gadget mutual-exclude long word */
  46.         NULL,   /* SpecialInfo structure */
  47.         3,      /* user-definable data */
  48.         NULL    /* pointer to user-definable data */
  49. };
  50.  
  51. SHORT BorderVectors2[] = {
  52.         0,0,
  53.         14,0,
  54.         14,10,
  55.         8,10,
  56.         8,5,
  57.         10,5,
  58.         7,2,
  59.         6,2,
  60.         3,5,
  61.         5,5,
  62.         5,10,
  63.         0,10,
  64.         0,0
  65. };
  66. struct Border Border2 = {
  67.         0,-1,  /* XY origin relative to container TopLeft */
  68.         1,0,JAM1,       /* front pen, back pen and drawmode */
  69.         13,      /* number of XY vectors */
  70.         BorderVectors2, /* pointer to XY vectors */
  71.         NULL    /* next border in list */
  72. };
  73.  
  74. /* arrow up */
  75. struct Gadget Gadget2 = {
  76.         &Gadget3,       /* next gadget */
  77.         -15,11, /* origin XY of hit box relative to window TopLeft */
  78.         16,9,   /* hit box width and height */
  79.         GRELRIGHT,    /* gadget flags */
  80.         RELVERIFY+GADGIMMEDIATE+RIGHTBORDER,       /* activation flags */
  81.         BOOLGADGET,     /* gadget type flags */
  82.         (APTR)&Border2, /* gadget border or image to be rendered */
  83.         NULL,   /* alternate imagery for selection */
  84.         NULL,   /* first IntuiText structure */
  85.         NULL,   /* gadget mutual-exclude long word */
  86.         NULL,   /* SpecialInfo structure */
  87.         2,      /* user-definable data */
  88.         NULL    /* pointer to user-definable data */
  89. };
  90.  
  91. struct PropInfo Gadget1SInfo = {
  92.         AUTOKNOB+FREEVERT,      /* PropInfo flags */
  93.         -1,-1,  /* horizontal and vertical pot values */
  94.         -1,-1,  /* horizontal and vertical body values */
  95. };
  96.  
  97. struct Image Image1 = {
  98.         0,0,    /* XY origin relative to container TopLeft */
  99.         7,80,   /* Image width and height in pixels */
  100.         0,      /* number of bitplanes in Image */
  101.         NULL,   /* pointer to ImageData */
  102.         0x0000,0x0000,  /* PlanePick and PlaneOnOff */
  103.         NULL    /* next Image structure */
  104. };
  105.  
  106. /* scroll bar */
  107. struct Gadget Gadget1 = {
  108.         &Gadget2,       /* next gadget */
  109.         -15,20, /* origin XY of hit box relative to window TopLeft */
  110.         16,-39, /* hit box width and height */
  111.         GADGHBOX+GADGHIMAGE+GRELRIGHT+GRELHEIGHT,       /* gadget flags */
  112.         RELVERIFY+GADGIMMEDIATE+RIGHTBORDER,        /* activation flags */
  113.         PROPGADGET,     /* gadget type flags */
  114.         (APTR)&Image1,  /* gadget border or image to be rendered */
  115.         NULL,   /* alternate imagery for selection */
  116.         NULL,   /* first IntuiText structure */
  117.         NULL,   /* gadget mutual-exclude long word */
  118.         (APTR)&Gadget1SInfo,    /* SpecialInfo structure */
  119.         1,      /* user-definable data */
  120.         NULL    /* pointer to user-definable data */
  121. };
  122.  
  123. #define GadgetList1 Gadget1
  124.  
  125. short knob_modified;
  126.  
  127. /*** code section ***/
  128.  
  129. set_prop() /* set scroll bar */
  130. {
  131.    register ED *ep = Ep;
  132.    register struct PropInfo *pInf = &Gadget1SInfo;
  133.    register ULONG newPot,newBody;
  134.  
  135.    newPot =  0xFFFF * ep->Topline / ((ep->Lines-Rows > 1) ? ep->Lines-Rows - 1 : 1);
  136.    newBody = 0xFFFF * ((Rows < ep->Lines) ? Rows : ep->Lines) / ep->Lines;
  137.  
  138.    if(newPot > 0xffff)
  139.       newPot = 0xffff;
  140.    if((pInf->VertPot != newPot) || (pInf->VertBody != newBody)) {
  141.       NewModifyProp(&Gadget1,Win,NULL,pInf->Flags,(USHORT)0,(USHORT)newPot,(USHORT)0,(USHORT)newBody,1);
  142.       knob_modified = 0;
  143.    }
  144. }
  145.  
  146. SetPropKnob()
  147. {
  148.    register ED *ep = Ep;
  149.    register struct PropInfo *pInf = &Gadget1SInfo;
  150.    register USHORT px,py;
  151.    register USHORT ky_start,ky_end;
  152.    register USHORT kHeight,cHeight;
  153.    register ULONG  newPot;
  154.  
  155.    cHeight = pInf->CHeight-5;
  156.    px = Win->Width-12;
  157.    py = 22;
  158.  
  159.    newPot =  0xFFFF * ep->Topline / ((ep->Lines-Rows > 1) ? ep->Lines-Rows - 1 : 1);
  160.    pInf->VertBody = 0xFFFF * ((Rows < ep->Lines) ? Rows : ep->Lines) / ep->Lines;
  161.  
  162.    if(newPot > 0xffff)
  163.       newPot = 0xffff;
  164.    pInf->VertPot =  newPot;
  165.  
  166.    kHeight =  cHeight * (long)pInf->VertBody / 0xffff;
  167.    if(kHeight < 3)
  168.       kHeight = 3;
  169.  
  170.    if(kHeight >= cHeight)
  171.       kHeight = cHeight - 1;
  172.  
  173.    ky_start = py + (cHeight-kHeight) * newPot / 0xffff;
  174.    ky_end   = ky_start + kHeight;
  175.    if(ky_end - ky_start < 1)
  176.       ky_end = ky_start +1;
  177.  
  178.    SetAPen(Rp,0);
  179.    RectFill(Rp,px,py,px+9,py+cHeight);
  180.    SetAPen(Rp,1);
  181.    RectFill(Rp,px,ky_start,px+7,ky_end);
  182.  
  183.    knob_modified = 1;
  184. }
  185.  
  186. Gad(mess) /* handle gadgets put it in main.c */
  187.    struct IntuiMessage *mess;
  188. {
  189.    register struct Gadget *gad;
  190.    register int gadid;
  191.    register ED *ep = Ep;
  192.    register long n;
  193.    register short diff;
  194.  
  195.    if(!(Win->Flags & WINDOWACTIVE)) {
  196.       set_prop();
  197.    }
  198.    gad = (struct Gadget *)mess->IAddress;
  199.    gadid = gad->GadgetID;
  200.    switch(gadid) {
  201.    case 1: /* scroll bar */
  202.       n = (ep->Lines-Rows) * Gadget1SInfo.VertPot / 0xFFFF;
  203.       if (n < 0)
  204.           n = 0;
  205.       else
  206.           if (n >= ep->Lines-Rows)
  207.               n = (ep->Lines-Rows < 1 ? 1 : ep->Lines-Rows) - 1;
  208.  
  209.       diff = ep->Topline - n;
  210.       if(diff) {
  211.          text_cursor(0);
  212.          text_sync();
  213.          ep->Line = n + (ep->Line - ep->Topline);
  214.          ep->Topline = n;
  215.          if(diff > 0) {
  216.             if (diff < (Rows << 1) / 3 ) {
  217.                ScrollRaster(Rp,0,-Ysize*diff,COL(0),ROW(0),COL(Columns)-1,ROW(Rows)-1);
  218.                text_displayseg(0,diff);
  219.                text_load();
  220.                text_sync();
  221.                text_cursor(1);
  222.                break;
  223.             }
  224.          } else {
  225.             diff = -diff;
  226.             if (diff < (Rows << 1) / 3 ) {
  227.                ScrollRaster(Rp,0,Ysize*diff,COL(0),ROW(0),COL(Columns)-1,ROW(Rows)-1);
  228.                text_displayseg(Rows-diff,diff);
  229.                text_load();
  230.                text_sync();
  231.                text_cursor(1);
  232.                break;
  233.             }
  234.          }
  235.          text_load();
  236.          if (!text_sync())
  237.             text_redisplay();
  238.          text_cursor(1);
  239.       }
  240.       if(knob_modified)
  241.          set_prop();
  242.       break;
  243.    case 2: /* arrow up */
  244.       text_cursor(0);
  245.       do_scrollup();
  246.       text_cursor(1);
  247.       break;
  248.    case 3: /* arrow down */
  249.       text_cursor(0);
  250.       do_scrolldown();
  251.       text_cursor(1);
  252.       break;
  253.    }
  254. }
  255.  
  256.